﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSemanticAnalyser.SemanticTree
{
    using daBase.Objects.Safe;
    using daSyntaxAnalyser.SyntaxTree;

    /// <summary>
    /// Модуль
    /// </summary>
    public class UnitSemanticElement : FileSemanticElement
    {
        private List<UnitSemanticElement> privateunits;
        private List<ConstSemanticElement> privateconsts;
        private List<ResourceStringSemanticElement> privateresourcestrings;
        private List<CommonTypeSemanticElement> privatetypes;
        private List<VarSemanticElement> privatevars;
        private List<ThreadvarSemanticElement> privatethreadvars;
        private List<MethodSemanticElement> privatemethods;

        /// <summary>
        /// Внутреннние модули
        /// </summary>
        public List<UnitSemanticElement> PrivateUnits { get { return privateunits; } set { privateunits = value; } }

        /// <summary>
        /// Закрытые константы
        /// </summary>
        public List<ConstSemanticElement> PrivateConsts { get { return privateconsts; } set { privateconsts = value; } }

        /// <summary>
        /// Закрытые строковые ресурсы
        /// </summary>
        public List<ResourceStringSemanticElement> PrivateResourcestrings { get { return privateresourcestrings; } set { privateresourcestrings = value; } }

        /// <summary>
        /// Закрытые типы
        /// </summary>
        public List<CommonTypeSemanticElement> PrivateTypes { get { return privatetypes; } set { privatetypes = value; } }

        /// <summary>
        /// Закрытые переменные
        /// </summary>
        public List<VarSemanticElement> PrivateVars { get { return privatevars; } set { privatevars = value; } }

        /// <summary>
        /// Закрытые потоковые переменные
        /// </summary>
        public List<ThreadvarSemanticElement> PrivateThreadvars { get { return privatethreadvars; } set { privatethreadvars = value; } }

        /// <summary>
        /// Закрытые методы
        /// </summary>
        public List<MethodSemanticElement> PrivateMethods { get { return privatemethods; } set { privatemethods = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="Name">имя элемента</param>
        /// <param name="Parent">родительский элемент</param>
        /// <param name="Units">подключенные модули</param>
        /// <param name="Consts">константы</param>
        /// <param name="Resourcestrings">строковые ресурсы</param>
        /// <param name="Types">типы</param>
        /// <param name="Vars">переменные</param>
        /// <param name="Threadvars">потоковые переменные</param>
        /// <param name="Methods">методы</param>
        /// <param name="PrivateUnits">внутренние модули</param>
        /// <param name="PrivateConsts">закрытые константы</param>
        /// <param name="PrivateResourcestrings">закрытые строковые ресурсы</param>
        /// <param name="PrivateTypes">закрытые типы</param>
        /// <param name="PrivateVars">закрытые переменные</param>
        /// <param name="PrivateThreadvars">закрытые потоковые переменные</param>
        /// <param name="PrivateMethods">закрытые методы</param>
        /// <param name="SyntaxElement">соответствующий элемент синтаксического дерева</param>
        public UnitSemanticElement(string Name, IChildSemanticElement Parent, List<UnitSemanticElement> Units, List<ConstSemanticElement> Consts, List<ResourceStringSemanticElement> Resourcestrings, List<CommonTypeSemanticElement> Types, List<VarSemanticElement> Vars, List<ThreadvarSemanticElement> Threadvars, List<MethodSemanticElement> Methods, List<UnitSemanticElement> PrivateUnits, List<ConstSemanticElement> PrivateConsts, List<ResourceStringSemanticElement> PrivateResourcestrings, List<CommonTypeSemanticElement> PrivateTypes, List<VarSemanticElement> PrivateVars, List<ThreadvarSemanticElement> PrivateThreadvars, List<MethodSemanticElement> PrivateMethods, ISyntaxTreeElement SyntaxElement)
            : base(Name, Parent, Units, Consts, Resourcestrings, Types, Vars, Threadvars, Methods, SyntaxElement)
        {
            privateunits = (PrivateUnits == null) ? new List<UnitSemanticElement>() : PrivateUnits;
            privateconsts = (PrivateConsts == null) ? new List<ConstSemanticElement>() : PrivateConsts;
            privateresourcestrings = (PrivateResourcestrings == null) ? new List<ResourceStringSemanticElement>() : PrivateResourcestrings;
            privatetypes = (PrivateTypes == null) ? new List<CommonTypeSemanticElement>() : PrivateTypes;
            privatevars = (PrivateVars == null) ? new List<VarSemanticElement>() : PrivateVars;
            privatethreadvars = (PrivateThreadvars == null) ? new List<ThreadvarSemanticElement>() : PrivateThreadvars;
            privatemethods = (PrivateMethods == null) ? new List<MethodSemanticElement>() : PrivateMethods;
        }

        /// <summary>
        /// Конструктор (без закрытых секций)
        /// </summary>
        /// <param name="Name">имя элемента</param>
        /// <param name="Parent">родительский элемент</param>
        /// <param name="Units">подключенные модули</param>
        /// <param name="Consts">константы</param>
        /// <param name="Resourcestrings">строковые ресурсы</param>
        /// <param name="Types">типы</param>
        /// <param name="Vars">переменные</param>
        /// <param name="Threadvars">потоковые переменные</param>
        /// <param name="Methods">методы</param>
        /// <param name="SyntaxElement">соответствующий элемент синтаксического дерева</param>
        public UnitSemanticElement(string Name, IChildSemanticElement Parent, List<UnitSemanticElement> Units, List<ConstSemanticElement> Consts, List<ResourceStringSemanticElement> Resourcestrings, List<CommonTypeSemanticElement> Types, List<VarSemanticElement> Vars, List<ThreadvarSemanticElement> Threadvars, List<MethodSemanticElement> Methods, ISyntaxTreeElement SyntaxElement) : this(Name, Parent, Units, Consts, Resourcestrings, Types, Vars, Threadvars, Methods, null, null, null, null, null, null, null, SyntaxElement) { }

        /// <summary>
        /// Конструктор (пустой)
        /// </summary>
        /// <param name="Name">имя элемента</param>
        /// <param name="Parent">родительский элемент</param>
        /// <param name="SyntaxElement">соответствующий элемент синтаксического дерева</param>
        public UnitSemanticElement(string Name, IChildSemanticElement Parent, ISyntaxTreeElement SyntaxElement) : this(Name, Parent, null, null, null, null, null, null, null, SyntaxElement) { }
    }
}
